package com.mercycrazy.mq;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * 构建路由模式的消费者, 监听消息
 *
 * @author <a href="mailto:1443424326@qq.com">mercycrazy</a>
 * @since 2023-01-19
 */
public class RoutingConsumerB {

    public static void main(String[] args) throws Exception {

        // 1. 创建连接工厂以及参数配置
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2. 创建连接 Connection
        Connection connection = factory.newConnection();

        // 3. 创建管道 Channel
        Channel channel = connection.createChannel();

        // 4. 创建队列 Queue (简单模式不需要交换机 Exchange)
        // 如果队列已存在, 不会重复创建
        // queue: 队列名
        // durable: 是否持久化, true: 重启后, 队列依然存在, 否则不存在
        // exclusive: 是否独占, true: 只能有一个消费者监听这个队列, 一般设置为 false
        // autoDelete: 是否自动删除, true: 当没有消费者的时候, 自动删除队列
        // arguments: map 类型其他参数
        String routing_queue_pay = "routing_queue_pay";
        channel.queueDeclare(routing_queue_pay, true, false, false, null);

        // 5. 监听并消费消息
        Consumer consumer = new DefaultConsumer(channel) {
            /**
             * 重写消息配送方法
             *
             * @param consumerTag 消费者标签(标识)
             * @param envelope    信封(一些信息, 比如交换机路由等信息)
             * @param properties  配置信息, 和生产者的一致
             * @param body        消息数据
             */
            @Override
            public void handleDelivery(String consumerTag,
                                       Envelope envelope,
                                       AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {

                System.out.println("body = " + new String(body));
            }
        };
        // queue: 监听的队列名
        // autoAck: 是否自动确认, true: 告知 mq 消费者已经消费的确认通知
        // callback: 回调函数, 处理监听的消息
        channel.basicConsume(routing_queue_pay, true, consumer);

        // 不关闭连接, 则持续监听
    }
}
